#define _CRT_SECURE_NO_WARNINGS 1


		《 sleep 》

 :!man 3 sleep  查看 sleep 相关信息
 头文件：#include <unistd.h>

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("hello world! \n hello bit");		// sleep 期间，打印的字符被保存在了缓冲区。并没有直接输出到屏幕。 
    sleep(3);

    return 0;
}

程序结束时，一般会自动冲刷缓冲区。
 \n  会立刻刷新缓存区
hello world!	
3秒后输出： hello bit


计算机一般默认打开3个标准流，标准 输入、输出、错误 流
extern FILE* stdin;		键盘
extern FILE* stdout;		显示器
extern FILE* stderr;

———————————————————————————————————————————————————————————————————

		《 强制刷新缓冲区 》
 man fflush	//强制刷新缓冲区
	
int main()
{
    printf("hello world! \n hello bit");		// sleep 期间，打印的字符被保存在了缓冲区。并没有直接输出到屏幕。 
	  fflush(stdout);		//强制刷新标准 输出缓冲区  
 
	  sleep(3);

    return 0;
}


———————————————————————————————————————————————————————————————————

      < /r > 

int main()
{
    int cnt = 9;
    while (cnt >= 0)
    {
        printf("%d\r", cnt);    //写了1个，清1个。最后相当于什么都没打印
        --cnt;
        sleep(1);
    }
    return 0;
}

———————————————————————————————————————————————————————————————————

 man fflush	//强制刷新缓冲区

int main()
{
    int cnt = 9;
    while (cnt >= 0)
    {
        printf("倒计时：%d\r", cnt);		
        fflush(stdout);			//强制刷新标准 输出缓冲区  ，把当前输出的字符刷新到屏幕上。
        --cnt;
        sleep(1);
    }
	  printf("\n");
    return 0;
}

———————————————————————————————————————————————————————————————————

int main()
{
    int cnt = 10;			//打印的时候，打印的是 字符‘1’~ '9' ,   10 ==> '1''0',倒计时的时候会发现，后面的 ‘0’不变
    while (cnt >= 0)
    {	
        printf("倒计时：%2d\r", cnt);	//这里改为%2d ,就可以正常显示两位数的倒计时了。
        fflush(stdout);			//强制刷新标准 输出缓冲区  ，把当前输出的字符刷新到屏幕上。
        --cnt;
        sleep(1);
    }
	  printf("\n");
    return 0;
}

———————————————————————————————————————————————————————————————————


———————————————————————————————————————————————————————————————————


		《 进度条 》

先创建4个文件：
[a@192 process]$ touch Processbar.c	//	文件实现
[a@192 process]$ touch Processbar.h	//	文件声明
[a@192 process]$ touch Main.c			//	文件主体
[a@192 process]$ touch Makefile		//	自动化编译

	:vs Processbar.h	//在一个 Main.c 文件中 打开，另一个文件窗口 Processbar.h

———————————————————————————————————————————————————————————————————

		《 测试进度条3个文件 》
[a@192 process]$ cat Processbar.h
#pragma once
#include <stdio.h>
extern void ForTest();

[a@192 process] $ cat Processbar.c
#include "Processbar.h"
void ForTest()
{
	printf("this is for test\n");
	printf("this is for test\n");
	printf("this is for test\n");
	printf("this is for test\n");
	printf("this is for test\n");
	printf("this is for test\n");
}

[a@192 process]$ cat Main.c
#include "Processbar.h"
int main()
{
	ForTest();
	return 0;
}

[a@192 process]$ cat Makefile
processbar:Main.c Processbar.c
gcc -o $@ $^
.PHONY:clean
clean :
rm - f processbar

———————————————————————————————————————————————————————————————————


———————————————————————————————————————————————————————————————————


		《 进度条 》
// [#####  ......   #####] [100 %] [ | ]


#pragma once

#include <stdio.h>
#include <string.h>
#include <windows.h>


// extern void ForTest();
void ProcBar();


#define Length 102                 //设置进度条 长度，预留末尾 '>' 与 '\0'结束
#define Style '#'                  //进度条身体符号 ###>，或 ===> 方便更换

const char* lable = "|/-\\";      //  '\\'的意思： 2个'\' 输出 1个'\'，(1个'\'是续行符) 

void ProcBar()
{
    char bar[Length];
    memset(bar, '\0', sizeof(bar));
    int len = strlen(lable);

    int cnt = 0;
    while (cnt <= 100)
    {

        printf("[%-100s] [%3d%%] [%c] \r", bar, cnt, lable[cnt % len]);     // [###>           ] [ 3%] [/]  (进度条，进度，旋转符号)
        fflush(stdout);
        bar[cnt++] = Style;
        bar[cnt+1]='>';         //###>   前面带>
        bar[cnt++] = Style;
        
        //usleep(50000);        //延迟的微秒数（例如500000微秒=0.5秒）
        //sleep(1);             //延迟的秒数 （1秒）
        Sleep(100);
    }
    printf("\n");
}
 
//#include "Processbar.h"
int main()
{
    ProcBar();

    return 0;
}

// [#####  ......   #####>] [100 %] [ | ]

———————————————————————————————————————————————————————————————————


———————————————————————————————————————————————————————————————————






//———————————————————————————————————————————————————————————————————


//———————————————————————————————————————————————————————————————————


//			《 进度条 》

////		《 Processbar.h 》


#pragma once
#include <stdio.h>
#include <string.h>
#include <windows.h>
//#include <unistd.h>

#define Length 101
#define Style '='

const char* lable = "|/-\\";

typedef void(*callback_t)(double, double);  // 函数指针类型
void ProcBar(double total, double current); //(总大小， 当前下载量大小)

//———————————————————————————————————————————————————————————————————

////		《 Processbar.c 》

//version 2
//#include "Processbar.h”

void ProcBar(double total, double current) 
{
	char bar[Length];
	memset(bar, '\0', sizeof(bar));         // 初始化进图的 条形为 100个空格 + 1个\0结束
	int len = strlen(lable);
	int cnt = 0;
	double rate = (current * 100.0) / total;// 求出进度的 百分比 %
	int loop_count = (int)rate;             // 当前进度 %
	while (cnt <= loop_count)
	{
        bar[cnt+1]='>';                     //箭头引领   ====>
		bar[cnt++] = Style; 
		//usleep(20000);
	}
	printf("[%-100s][%.1lf%%][%c]\r", bar, rate, lable[cnt % len]); 
	fflush(stdout);
}


//———————————————————————————————————————————————————————————————————

////		《 Main.c 》


//#include "Processbar.h"
//#include <unistd.h>

double bandwidth = 1024 * 1024 * 1.0;	//网络带宽 1M 
// download
void download(double filesize, callback_t cb)   //(文件总大小，打印进度条下载情况)
{ 
	double current = 0.0;               //当前下载量
	printf("download begin, current: %lf\n", current);
	while (current <= filesize)
	{
		cb(filesize, current);      //函数指针类型 cb为 ProcBar(double, double)类型
		// 从网络中获取数据
		//usleep(100000);
		Sleep(100000);

		current += bandwidth;
	}
	printf("\n download done,filesize: %1f\n", filesize);   //download done,filesize(下载量为): 104857600.000000
}

int main()
{
	//printf("\033[1;31;40m Hello wor1d ! \033[0m\n");
	download(100 * 1024 * 1024, ProcBar);
	//download(2 * 1024 * 1024, ProcBar);
	//download(200 * 1024 * 1024, ProcBar);
	//download(400 * 1024 * 1024, ProcBar);
	//download(50 * 1024 * 1024, ProcBar);
	//download(10 * 1024 * 1024, ProcBar);

	return 0;
}

//———————————————————————————————————————————————————————————————————


//———————————————————————————————————————————————————————————————————


        《 git(版本控制) 》

安装 git: 
sudo yum install -y git






